using System;
using System.Collections.Generic;
using System.Text;

namespace OPTFleet.OPTFleet {
	
    public class Encomenda {
		
        private int idencomenda;
		private Double largura;
		private Double comprimento;
        private Double altura;
		private DateTime datapedido;
        private Cliente cliente;
        private DateTime processada;
        private SortedDictionary<String, Int32> produtos;

        public int IDencomenda{
            get{ return idencomenda; }
            set{ idencomenda = value; }
        }

        public Double Largura{
            get { return largura; }
            set { largura = value; }
        }

        public Double Comprimento{
            get {return comprimento; }
            set { comprimento = value; }
        }

        public Double Altura
        {
            get { return altura; }
            set { altura = value; }
        }

        public DateTime Datapedido{
            get { return datapedido; }
            set {datapedido = value; }
        }

        public DateTime Processada{
            get { return processada; }
            set { processada = value; }
        }

        public Cliente Cliente{
            get {return cliente; }
            set {cliente = value; }
        }

        public SortedDictionary<String, Int32> Produtos{
            get {
                SortedDictionary<String, Int32> aux = new SortedDictionary<String, Int32>();
                foreach (String s in produtos.Keys)
                {
                    aux.Add(s, produtos[s]);
                }
                return aux;
            }
            set
            {
                produtos = new SortedDictionary<String, Int32>();
                foreach (String s in value.Keys)
                {
                    produtos.Add(s, value[s]);
                }
            }
        }

        public Encomenda()
        {
            idencomenda = 0;
            largura = 0;
            comprimento = 0;
            datapedido = new DateTime();
            cliente = new Cliente();
        }

        public Encomenda(int idencomenda, Double altura, Double largura, Double comprimento, DateTime datapedido,Cliente cliente, DateTime processada, SortedDictionary<String, Int32> produtos)
        {
            this.IDencomenda = idencomenda;
            this.Altura = altura;
            this.Largura = largura;
            this.Comprimento = comprimento;
            this.Datapedido = datapedido;
            this.Cliente = cliente;
            this.Processada = processada;
            this.Produtos = produtos;
        }

        public class OrdenarPorPrioridade : IComparer<Encomenda>
        {
            int IComparer<Encomenda>.Compare(Encomenda e1, Encomenda e2)
            {
                //Console.WriteLine("E1: " + e1.IDencomenda);
                //Console.WriteLine("E2: " + e2.IDencomenda);
                if (e1.Cliente.Prioridade < e2.Cliente.Prioridade)
                    return -1;
                if (e1.Cliente.Prioridade > e2.Cliente.Prioridade)
                    return 1;
                if (e1.IDencomenda < e2.IDencomenda)
                    return -1;
                if (e1.IDencomenda > e2.IDencomenda)
                    return 1;
                return 0;
            }
        }



        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("-------------Encomenda-------------");
            sb.Append("\nIDEncomenda: " + idencomenda);
            sb.Append("\nLargura: " + largura);
            sb.Append("\nComprimento: " + comprimento);
            sb.Append("\nAltura " + altura);
            sb.Append("\nData do pedido: " + datapedido.ToString());
            sb.Append("\nProcessada: " + processada);
            sb.Append("\nN de Produtos: " + produtos.Count);
            sb.Append("\n" + cliente.ToString());
            sb.Append("\n-----------------------------------");

            return sb.ToString();
        }
	}

}
